package innerclass;

public class StaticInnerClass01 {
    public static void main(String[] args) {
        Outer10 outer10 = new Outer10();
        outer10.m1();

        //外部其他类 使用静态内部类
        //方式1
        //因为静态内部类，是可以通过类名直接访问（前提是满足访问权限）
        Outer10.Inner10 inner10 = new Outer10.Inner10();
        inner10.say();
        //方式2
        //编写一个方法，可以返回静态内部类的对象实例
        Outer10.Inner10 inner10Instance = outer10.getInner10Instance();
        System.out.println("===========");
        inner10Instance.say();

        //方式3
        //因为静态成员是随类的加载而创建，所以即使没有创建对象实例，也可以访问
        //类名.类方法名
        Outer10.Inner10 inner10Instance1 = Outer10.getInner10Instance_();
        System.out.println("***********");
        inner10Instance1.say();
    }
}

class Outer10 { // 外部类
    private int n1 = 10;
    private static String name = "张三";
    public static void cry(){};

    //Inner10就是静态内部类
    //1.放在外部类的成员位置
    //2.使用static修饰
    //4.可以添加任意访问修饰符（public、protected、默认、private),因为它的地位就是一个成员。
    public static class Inner10 {
        private static String name = "李四";
        public void say() {
            //3.可以直接访问外部类的所有静态成员，包含私有的，但不能直接访问非静态成员
            //8.如果外部类和静态内部类的成员重名时，静态内部类访问的时，默认遵循就近原则，
            // 如果想访问外部类的成员，则可以使用（外部类名.成员）去访问
            System.out.println(name + " 外部 name=" + Outer10.name);
            //6.静态内部类---访问---->外部类（比如：静态属性）
            //[访问方式：直接访问所有静态成员]
            cry();
        }
    }

    //5.作用域：同其他的成员，为整个类体
    public void m1() {
        //7.外部类---访问------>静态内部类访问方式
        //[创建对象，再访问]
        Inner10 inner10 = new Inner10();
        inner10.say();
    }

    //静态方法只能访问静态的成员，非静态的方法既可以访问静态成员，也可以访问普通成员
    public Inner10 getInner10Instance () {
        return new Inner10();
    }

    public static Inner10 getInner10Instance_ () {
        return new Inner10();
    }
}


